package org.dcarew.halostatus.utils;

import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.StatusLineLayoutData;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;

/**
 * A ContributionItem for the application's status line. This is used to show the Halo icon and the
 * number of players online.
 * 
 * @author Devon Carew
 */
public class LabelContributionItem
	extends ContributionItem
{
	public final static int	DEFAULT_CHAR_WIDTH	= 40;
	
	private CLabel			countLabel;
	private CLabel			imageLabel;
	
	private int				charWidth;
	
	private Image			image;
	private String			text		= "";
	private String			tooltip;
	private int				widthHint	= -1;
	
	
	public LabelContributionItem(String id)
	{
		this(id, -1);
	}
	
	public LabelContributionItem(String id, int charWidth)
	{
		super(id);
		
		this.charWidth = charWidth;
	}
	
	public void fill(Composite parent)
	{
		// separator
		//new Label(parent, SWT.SEPARATOR);
		
		// count label
		countLabel = new CLabel(parent, SWT.SHADOW_NONE | SWT.RIGHT);
		
		if (widthHint < 0)
		{
			GC gc = new GC(parent);
			gc.setFont(parent.getFont());
			FontMetrics fm = gc.getFontMetrics();
			
			if (charWidth == -1)
				widthHint = fm.getAverageCharWidth() * text.length();
			else
				widthHint = fm.getAverageCharWidth() * charWidth;
			
			widthHint += image.getBounds().width + 10;
			gc.dispose();
		}
		
		countLabel.setLayoutData(createStatusLineLayoutData(widthHint, SWT.DEFAULT));
		countLabel.setText(text);
		
		if (tooltip != null)
			countLabel.setToolTipText(tooltip);
		
		// image label
		imageLabel = new CLabel(parent, SWT.SHADOW_NONE);
		imageLabel.setImage(image);
		imageLabel.setToolTipText("Halo 3 Status");
	}
	
	private static StatusLineLayoutData createStatusLineLayoutData(int widthHint, int heightHint)
	{
		StatusLineLayoutData data = new StatusLineLayoutData();
		
		data.widthHint = widthHint;
		data.heightHint = heightHint;
		
		return data;
	}
	
	public void setText(String text)
	{
		if (text == null)
			throw new IllegalArgumentException("text cannot be null");
		
		this.text = text;
		
		if (countLabel != null && !countLabel.isDisposed())
			countLabel.setText(this.text);
		
		if (getParent() != null)
			getParent().update(true);
	}
	
	public void setTooltip(String tooltip)
	{
		this.tooltip = tooltip;
		
		if (countLabel != null && !countLabel.isDisposed())
		{
			countLabel.setToolTipText(tooltip);
		}
	}
	
	public void setImage(Image image)
	{
		this.image = image;
		
		if (imageLabel != null && !imageLabel.isDisposed())
			imageLabel.setImage(this.image);
	}

}
